package cxy.highConcurrency;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 缓存导致的可见性问题 线程切换带来的原子性问题
 * 变量 count 的可见性和 count+=1 的原子性上
 * 可见性问题可以用 volatile 来解决，而原子性问题我们前面一直都是采用的互斥锁方案,对于简单的原子性问题，还有一种无锁方案
 * 
 * @author admin
 *
 */
public class MemoryVisibleDemo {

	public static void main(String[] args) throws InterruptedException {
		calc();
	}

	private static long count = 0;

	private static AtomicLong atomicLong = new AtomicLong(0);

	private void add10kAtomic() {
		int idx = 0;
		while (idx++ < 10000) {
			atomicLong.getAndIncrement();
		}
	}

	private void add10K() {
		int idx = 0;
		while (idx++ < 10000) {
			// synchronized (this) {
			// 一条语句对应3条cpu指令
			count += 1;
			// }
		}
	}

	public static void calc() throws InterruptedException {
		final MemoryVisibleDemo test = new MemoryVisibleDemo();
		// 创建两个线程，执行add()操作
		Thread th1 = new Thread(() -> {
			test.add10kAtomic();
		});
		Thread th2 = new Thread(() -> {
			test.add10kAtomic();
		});
		// 启动两个线程
		th1.start();
		th2.start();
		
		// 等待两个线程执行结束
		th1.join();
		th2.join();
		
		System.out.println(atomicLong);
	}
}
